//
// Created by Mzoro on 2022/4/1.
//
#include <stdio.h>

#define dprint(ex) printf(" %d,",ex)
#define pl         printf("\n")

// 将数组作为参数入参时，实质上是将第一个元素的指针传进去了，下面两个声明可以看出这一点
void test(int arr[]);
void test2(int *arr);
int main(){
    int arr[10] = {0,1,2,3,4,5,6,7,8,9};
    int *pa, *pa2;
    pa = arr;
    // 和下面的一样 , 说明arr就是指向第一个元素的指针
    pa2 = &arr[0];
    for (int i = 0; i < 10; ++i) {
        dprint(arr[i]);
    }
    pl;
    for (int i = 0; i < 10; ++i) {
        dprint(pa[i]);
    }
    pl;
    for (int i = 0; i < 10; ++i) {
        dprint(pa2[i]);
    }
    pl;

    // 下面是访问数组的另一种写法,是等价于用下标访问的，下标访问最后也会被转为下面的方式
    for (int i = 0; i < 10; ++i) {
        dprint(*(arr + i));
    }
    pl;
    // 可以将 arr 赋值给 pa, 但是反过来不行 ，因为数组不单是一个指针
    // arr = pa;

    // 将数组做为参数传递时，实质上是将一个第一个指针传进去了
    printf("array length %ld\n",sizeof(arr)/sizeof(int));
    test2(arr);
    test(&arr[0]);
    test2(&arr[0]);
    // 类似将数组的一部分传进去，但是访问内依然可以通过 arr[-1]访问到前面的元素，但是危险
    test(&arr[3]);

    // 指针变量可以运算，但数组不可以
    //arr++;
    pa++;
    return 0;
}


void test(int arr[]){
    // 在这里debug 可以看到arr是一个指针，它将丢失一些信息, 使用它计算数组长度是错的
    printf("test，array length %ld\n",sizeof(arr)/sizeof(int));
}

void test2(int *arr){
    // 在这里debug 可以看到arr是一个指针，它将丢失一些信息, 使用它计算数组长度是错的
    printf("test2，array length %ld \n",sizeof(arr)/sizeof(int));
}